from enum import IntEnum
from typing import overload, NewType, Optional, Tuple

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.gp import *
from OCC.Core.TColStd import *
from OCC.Core.TColgp import *
from OCC.Core.BVH import *


class Bnd_Array1OfBox:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> Bnd_Box: ...
    def __setitem__(self, index: int, value: Bnd_Box) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[Bnd_Box]: ...
    def next(self) -> Bnd_Box: ...
    __next__ = next
    def Init(self, theValue: Bnd_Box) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> Bnd_Box: ...
    def Last(self) -> Bnd_Box: ...
    def Value(self, theIndex: int) -> Bnd_Box: ...
    def SetValue(self, theIndex: int, theValue: Bnd_Box) -> None: ...

class Bnd_Array1OfBox2d:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> Bnd_Box2d: ...
    def __setitem__(self, index: int, value: Bnd_Box2d) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[Bnd_Box2d]: ...
    def next(self) -> Bnd_Box2d: ...
    __next__ = next
    def Init(self, theValue: Bnd_Box2d) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> Bnd_Box2d: ...
    def Last(self) -> Bnd_Box2d: ...
    def Value(self, theIndex: int) -> Bnd_Box2d: ...
    def SetValue(self, theIndex: int, theValue: Bnd_Box2d) -> None: ...

class Bnd_Array1OfSphere:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> Bnd_Sphere: ...
    def __setitem__(self, index: int, value: Bnd_Sphere) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[Bnd_Sphere]: ...
    def next(self) -> Bnd_Sphere: ...
    __next__ = next
    def Init(self, theValue: Bnd_Sphere) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> Bnd_Sphere: ...
    def Last(self) -> Bnd_Sphere: ...
    def Value(self, theIndex: int) -> Bnd_Sphere: ...
    def SetValue(self, theIndex: int, theValue: Bnd_Sphere) -> None: ...

class Bnd_B2d:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theCenter: gp_XY, theHSize: gp_XY) -> None: ...
    @overload
    def Add(self, thePnt: gp_XY) -> None: ...
    @overload
    def Add(self, thePnt: gp_Pnt2d) -> None: ...
    @overload
    def Add(self, theBox: Bnd_B2d) -> None: ...
    def Clear(self) -> None: ...
    def CornerMax(self) -> gp_XY: ...
    def CornerMin(self) -> gp_XY: ...
    def Enlarge(self, theDiff: float) -> None: ...
    @overload
    def IsIn(self, theBox: Bnd_B2d) -> bool: ...
    @overload
    def IsIn(self, theBox: Bnd_B2d, theTrsf: gp_Trsf2d) -> bool: ...
    @overload
    def IsOut(self, thePnt: gp_XY) -> bool: ...
    @overload
    def IsOut(self, theCenter: gp_XY, theRadius: float, isCircleHollow: Optional[bool] = False) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B2d) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B2d, theTrsf: gp_Trsf2d) -> bool: ...
    @overload
    def IsOut(self, theLine: gp_Ax2d) -> bool: ...
    @overload
    def IsOut(self, theP0: gp_XY, theP1: gp_XY) -> bool: ...
    def IsVoid(self) -> bool: ...
    def Limit(self, theOtherBox: Bnd_B2d) -> bool: ...
    def SetCenter(self, theCenter: gp_XY) -> None: ...
    def SetHSize(self, theHSize: gp_XY) -> None: ...
    def SquareExtent(self) -> float: ...
    def Transformed(self, theTrsf: gp_Trsf2d) -> Bnd_B2d: ...

class Bnd_B2f:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theCenter: gp_XY, theHSize: gp_XY) -> None: ...
    @overload
    def Add(self, thePnt: gp_XY) -> None: ...
    @overload
    def Add(self, thePnt: gp_Pnt2d) -> None: ...
    @overload
    def Add(self, theBox: Bnd_B2f) -> None: ...
    def Clear(self) -> None: ...
    def CornerMax(self) -> gp_XY: ...
    def CornerMin(self) -> gp_XY: ...
    def Enlarge(self, theDiff: float) -> None: ...
    @overload
    def IsIn(self, theBox: Bnd_B2f) -> bool: ...
    @overload
    def IsIn(self, theBox: Bnd_B2f, theTrsf: gp_Trsf2d) -> bool: ...
    @overload
    def IsOut(self, thePnt: gp_XY) -> bool: ...
    @overload
    def IsOut(self, theCenter: gp_XY, theRadius: float, isCircleHollow: Optional[bool] = False) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B2f) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B2f, theTrsf: gp_Trsf2d) -> bool: ...
    @overload
    def IsOut(self, theLine: gp_Ax2d) -> bool: ...
    @overload
    def IsOut(self, theP0: gp_XY, theP1: gp_XY) -> bool: ...
    def IsVoid(self) -> bool: ...
    def Limit(self, theOtherBox: Bnd_B2f) -> bool: ...
    def SetCenter(self, theCenter: gp_XY) -> None: ...
    def SetHSize(self, theHSize: gp_XY) -> None: ...
    def SquareExtent(self) -> float: ...
    def Transformed(self, theTrsf: gp_Trsf2d) -> Bnd_B2f: ...

class Bnd_B3d:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theCenter: gp_XYZ, theHSize: gp_XYZ) -> None: ...
    @overload
    def Add(self, thePnt: gp_XYZ) -> None: ...
    @overload
    def Add(self, thePnt: gp_Pnt) -> None: ...
    @overload
    def Add(self, theBox: Bnd_B3d) -> None: ...
    def Clear(self) -> None: ...
    def CornerMax(self) -> gp_XYZ: ...
    def CornerMin(self) -> gp_XYZ: ...
    def Enlarge(self, theDiff: float) -> None: ...
    @overload
    def IsIn(self, theBox: Bnd_B3d) -> bool: ...
    @overload
    def IsIn(self, theBox: Bnd_B3d, theTrsf: gp_Trsf) -> bool: ...
    @overload
    def IsOut(self, thePnt: gp_XYZ) -> bool: ...
    @overload
    def IsOut(self, theCenter: gp_XYZ, theRadius: float, isSphereHollow: Optional[bool] = False) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B3d) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B3d, theTrsf: gp_Trsf) -> bool: ...
    @overload
    def IsOut(self, theLine: gp_Ax1, isRay: Optional[bool] = False, theOverthickness: Optional[float] = 0.0) -> bool: ...
    @overload
    def IsOut(self, thePlane: gp_Ax3) -> bool: ...
    def IsVoid(self) -> bool: ...
    def Limit(self, theOtherBox: Bnd_B3d) -> bool: ...
    def SetCenter(self, theCenter: gp_XYZ) -> None: ...
    def SetHSize(self, theHSize: gp_XYZ) -> None: ...
    def SquareExtent(self) -> float: ...
    def Transformed(self, theTrsf: gp_Trsf) -> Bnd_B3d: ...

class Bnd_B3f:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theCenter: gp_XYZ, theHSize: gp_XYZ) -> None: ...
    @overload
    def Add(self, thePnt: gp_XYZ) -> None: ...
    @overload
    def Add(self, thePnt: gp_Pnt) -> None: ...
    @overload
    def Add(self, theBox: Bnd_B3f) -> None: ...
    def Clear(self) -> None: ...
    def CornerMax(self) -> gp_XYZ: ...
    def CornerMin(self) -> gp_XYZ: ...
    def Enlarge(self, theDiff: float) -> None: ...
    @overload
    def IsIn(self, theBox: Bnd_B3f) -> bool: ...
    @overload
    def IsIn(self, theBox: Bnd_B3f, theTrsf: gp_Trsf) -> bool: ...
    @overload
    def IsOut(self, thePnt: gp_XYZ) -> bool: ...
    @overload
    def IsOut(self, theCenter: gp_XYZ, theRadius: float, isSphereHollow: Optional[bool] = False) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B3f) -> bool: ...
    @overload
    def IsOut(self, theOtherBox: Bnd_B3f, theTrsf: gp_Trsf) -> bool: ...
    @overload
    def IsOut(self, theLine: gp_Ax1, isRay: Optional[bool] = False, theOverthickness: Optional[float] = 0.0) -> bool: ...
    @overload
    def IsOut(self, thePlane: gp_Ax3) -> bool: ...
    def IsVoid(self) -> bool: ...
    def Limit(self, theOtherBox: Bnd_B3f) -> bool: ...
    def SetCenter(self, theCenter: gp_XYZ) -> None: ...
    def SetHSize(self, theHSize: gp_XYZ) -> None: ...
    def SquareExtent(self) -> float: ...
    def Transformed(self, theTrsf: gp_Trsf) -> Bnd_B3f: ...

class Bnd_BoundSortBox:
    def __init__(self) -> None: ...
    def Add(self, theBox: Bnd_Box, boxIndex: int) -> None: ...
    @overload
    def Compare(self, theBox: Bnd_Box) -> TColStd_ListOfInteger: ...
    @overload
    def Compare(self, P: gp_Pln) -> TColStd_ListOfInteger: ...
    def Destroy(self) -> None: ...
    def Dump(self) -> None: ...
    @overload
    def Initialize(self, CompleteBox: Bnd_Box, SetOfBox: Bnd_HArray1OfBox) -> None: ...
    @overload
    def Initialize(self, SetOfBox: Bnd_HArray1OfBox) -> None: ...
    @overload
    def Initialize(self, CompleteBox: Bnd_Box, nbComponents: int) -> None: ...

class Bnd_Box:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theMin: gp_Pnt, theMax: gp_Pnt) -> None: ...
    @overload
    def Add(self, Other: Bnd_Box) -> None: ...
    @overload
    def Add(self, P: gp_Pnt) -> None: ...
    @overload
    def Add(self, P: gp_Pnt, D: gp_Dir) -> None: ...
    @overload
    def Add(self, D: gp_Dir) -> None: ...
    def CornerMax(self) -> gp_Pnt: ...
    def CornerMin(self) -> gp_Pnt: ...
    def Distance(self, Other: Bnd_Box) -> float: ...
    def Dump(self) -> None: ...
    def DumpJson(self, depth: Optional[int]=-1) -> str: ...
    def Enlarge(self, Tol: float) -> None: ...
    def FinitePart(self) -> Bnd_Box: ...
    def Get(self) -> Tuple[float, float, float, float, float, float]: ...
    def GetGap(self) -> float: ...
    def HasFinitePart(self) -> bool: ...
    def InitFromJson(self, json_string: str) -> bool: ...
    def IsOpen(self) -> bool: ...
    def IsOpenXmax(self) -> bool: ...
    def IsOpenXmin(self) -> bool: ...
    def IsOpenYmax(self) -> bool: ...
    def IsOpenYmin(self) -> bool: ...
    def IsOpenZmax(self) -> bool: ...
    def IsOpenZmin(self) -> bool: ...
    @overload
    def IsOut(self, P: gp_Pnt) -> bool: ...
    @overload
    def IsOut(self, L: gp_Lin) -> bool: ...
    @overload
    def IsOut(self, P: gp_Pln) -> bool: ...
    @overload
    def IsOut(self, Other: Bnd_Box) -> bool: ...
    @overload
    def IsOut(self, Other: Bnd_Box, T: gp_Trsf) -> bool: ...
    @overload
    def IsOut(self, T1: gp_Trsf, Other: Bnd_Box, T2: gp_Trsf) -> bool: ...
    @overload
    def IsOut(self, P1: gp_Pnt, P2: gp_Pnt, D: gp_Dir) -> bool: ...
    def IsThin(self, tol: float) -> bool: ...
    def IsVoid(self) -> bool: ...
    def IsWhole(self) -> bool: ...
    def IsXThin(self, tol: float) -> bool: ...
    def IsYThin(self, tol: float) -> bool: ...
    def IsZThin(self, tol: float) -> bool: ...
    def OpenXmax(self) -> None: ...
    def OpenXmin(self) -> None: ...
    def OpenYmax(self) -> None: ...
    def OpenYmin(self) -> None: ...
    def OpenZmax(self) -> None: ...
    def OpenZmin(self) -> None: ...
    @overload
    def Set(self, P: gp_Pnt) -> None: ...
    @overload
    def Set(self, P: gp_Pnt, D: gp_Dir) -> None: ...
    def SetGap(self, Tol: float) -> None: ...
    def SetVoid(self) -> None: ...
    def SetWhole(self) -> None: ...
    def SquareExtent(self) -> float: ...
    def Transformed(self, T: gp_Trsf) -> Bnd_Box: ...
    @overload
    def Update(self, aXmin: float, aYmin: float, aZmin: float, aXmax: float, aYmax: float, aZmax: float) -> None: ...
    @overload
    def Update(self, X: float, Y: float, Z: float) -> None: ...

class Bnd_Box2d:
    def __init__(self) -> None: ...
    @overload
    def Add(self, Other: Bnd_Box2d) -> None: ...
    @overload
    def Add(self, thePnt: gp_Pnt2d) -> None: ...
    @overload
    def Add(self, thePnt: gp_Pnt2d, theDir: gp_Dir2d) -> None: ...
    @overload
    def Add(self, D: gp_Dir2d) -> None: ...
    def Dump(self) -> None: ...
    def Enlarge(self, theTol: float) -> None: ...
    def Get(self) -> Tuple[float, float, float, float]: ...
    def GetGap(self) -> float: ...
    def IsOpenXmax(self) -> bool: ...
    def IsOpenXmin(self) -> bool: ...
    def IsOpenYmax(self) -> bool: ...
    def IsOpenYmin(self) -> bool: ...
    @overload
    def IsOut(self, P: gp_Pnt2d) -> bool: ...
    @overload
    def IsOut(self, theL: gp_Lin2d) -> bool: ...
    @overload
    def IsOut(self, theP0: gp_Pnt2d, theP1: gp_Pnt2d) -> bool: ...
    @overload
    def IsOut(self, Other: Bnd_Box2d) -> bool: ...
    @overload
    def IsOut(self, theOther: Bnd_Box2d, theTrsf: gp_Trsf2d) -> bool: ...
    @overload
    def IsOut(self, T1: gp_Trsf2d, Other: Bnd_Box2d, T2: gp_Trsf2d) -> bool: ...
    def IsVoid(self) -> bool: ...
    def IsWhole(self) -> bool: ...
    def OpenXmax(self) -> None: ...
    def OpenXmin(self) -> None: ...
    def OpenYmax(self) -> None: ...
    def OpenYmin(self) -> None: ...
    @overload
    def Set(self, thePnt: gp_Pnt2d) -> None: ...
    @overload
    def Set(self, thePnt: gp_Pnt2d, theDir: gp_Dir2d) -> None: ...
    def SetGap(self, Tol: float) -> None: ...
    def SetVoid(self) -> None: ...
    def SetWhole(self) -> None: ...
    def SquareExtent(self) -> float: ...
    def Transformed(self, T: gp_Trsf2d) -> Bnd_Box2d: ...
    @overload
    def Update(self, aXmin: float, aYmin: float, aXmax: float, aYmax: float) -> None: ...
    @overload
    def Update(self, X: float, Y: float) -> None: ...

class Bnd_OBB:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theCenter: gp_Pnt, theXDirection: gp_Dir, theYDirection: gp_Dir, theZDirection: gp_Dir, theHXSize: float, theHYSize: float, theHZSize: float) -> None: ...
    @overload
    def __init__(self, theBox: Bnd_Box) -> None: ...
    @overload
    def Add(self, theOther: Bnd_OBB) -> None: ...
    @overload
    def Add(self, theP: gp_Pnt) -> None: ...
    def Center(self) -> gp_XYZ: ...
    def DumpJson(self, depth: Optional[int]=-1) -> str: ...
    def Enlarge(self, theGapAdd: float) -> None: ...
    def GetVertex(self, theP_list: List[gp_Pnt]) -> bool: ...
    def IsAABox(self) -> bool: ...
    def IsCompletelyInside(self, theOther: Bnd_OBB) -> bool: ...
    @overload
    def IsOut(self, theOther: Bnd_OBB) -> bool: ...
    @overload
    def IsOut(self, theP: gp_Pnt) -> bool: ...
    def IsVoid(self) -> bool: ...
    def Position(self) -> gp_Ax3: ...
    def ReBuild(self, theListOfPoints: TColgp_Array1OfPnt, theListOfTolerances: Optional[TColStd_Array1OfReal] = 0, theIsOptimal: Optional[bool] = False) -> None: ...
    def SetAABox(self, theFlag: bool) -> None: ...
    def SetCenter(self, theCenter: gp_Pnt) -> None: ...
    def SetVoid(self) -> None: ...
    def SetXComponent(self, theXDirection: gp_Dir, theHXSize: float) -> None: ...
    def SetYComponent(self, theYDirection: gp_Dir, theHYSize: float) -> None: ...
    def SetZComponent(self, theZDirection: gp_Dir, theHZSize: float) -> None: ...
    def SquareExtent(self) -> float: ...
    def XDirection(self) -> gp_XYZ: ...
    def XHSize(self) -> float: ...
    def YDirection(self) -> gp_XYZ: ...
    def YHSize(self) -> float: ...
    def ZDirection(self) -> gp_XYZ: ...
    def ZHSize(self) -> float: ...

class Bnd_Range:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theMin: float, theMax: float) -> None: ...
    @overload
    def Add(self, theParameter: float) -> None: ...
    @overload
    def Add(self, theRange: Bnd_Range) -> None: ...
    def Common(self, theOther: Bnd_Range) -> None: ...
    def Delta(self) -> float: ...
    def DumpJson(self, depth: Optional[int]=-1) -> str: ...
    def Enlarge(self, theDelta: float) -> None: ...
    def GetBounds(self) -> Tuple[bool, float, float]: ...
    def GetIntermediatePoint(self, theLambda: float) -> Tuple[bool, float]: ...
    def GetMax(self) -> Tuple[bool, float]: ...
    def GetMin(self) -> Tuple[bool, float]: ...
    def IsIntersected(self, theVal: float, thePeriod: Optional[float] = 0.0) -> int: ...
    @overload
    def IsOut(self, theValue: float) -> bool: ...
    @overload
    def IsOut(self, theRange: Bnd_Range) -> bool: ...
    def IsVoid(self) -> bool: ...
    def SetVoid(self) -> None: ...
    def Shift(self, theVal: float) -> None: ...
    def Shifted(self, theVal: float) -> Bnd_Range: ...
    def TrimFrom(self, theValLower: float) -> None: ...
    def TrimTo(self, theValUpper: float) -> None: ...
    def Union(self, theOther: Bnd_Range) -> bool: ...

class Bnd_Sphere:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theCntr: gp_XYZ, theRad: float, theU: int, theV: int) -> None: ...
    def Add(self, theOther: Bnd_Sphere) -> None: ...
    def Center(self) -> gp_XYZ: ...
    def Distance(self, theNode: gp_XYZ) -> float: ...
    def Distances(self, theXYZ: gp_XYZ) -> Tuple[float, float]: ...
    @overload
    def IsOut(self, theOther: Bnd_Sphere) -> bool: ...
    @overload
    def IsOut(self, thePnt: gp_XYZ) -> Tuple[bool, float]: ...
    def IsValid(self) -> bool: ...
    def Project(self, theNode: gp_XYZ, theProjNode: gp_XYZ) -> Tuple[bool, float, bool]: ...
    def Radius(self) -> float: ...
    def SetValid(self, isValid: bool) -> None: ...
    def SquareDistance(self, theNode: gp_XYZ) -> float: ...
    def SquareDistances(self, theXYZ: gp_XYZ) -> Tuple[float, float]: ...
    def SquareExtent(self) -> float: ...
    def U(self) -> int: ...
    def V(self) -> int: ...

class Bnd_Tools:
    @overload
    @staticmethod
    def Bnd2BVH(theBox: Bnd_Box2d) -> False: ...
    @overload
    @staticmethod
    def Bnd2BVH(theBox: Bnd_Box) -> False: ...

# harray1 classes

class Bnd_HArray1OfBox(Bnd_Array1OfBox, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Bnd_Array1OfBox: ...


class Bnd_HArray1OfBox2d(Bnd_Array1OfBox2d, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Bnd_Array1OfBox2d: ...


class Bnd_HArray1OfSphere(Bnd_Array1OfSphere, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Bnd_Array1OfSphere: ...

# harray2 classes
# hsequence classes

